除了 Linux 作業系統之外,Windows 也是企業應用系統中佔據不少比例的作業系統。不過 Windows 本身不支援 Syslog 或 CEF 格式的記錄傳送方式,該如何處理?
這個問題不大,搭配成熟的開源軟體 NXLog 就能為我們解決這個問題。
Windows 內部採用 Eventlog 格式儲存記錄事件,並且提供了事件檢視器協助我們調閱相關記錄。要往外傳送至 Graylog 伺服器時,我們將搭配 NXLog 這套記錄轉送工具,它的功能非常強大,其中一個重要關鍵是可以將 Windows 當中的 Eventlog 轉換為 GELF 格式後傳送至 Graylog 的 GELF 輸入器,正好完美解決問題。
NXLog 提供了企業版 (Enterprise Edition) 與 社群版 (Community Edition),本系列文章將會用 NXLog CE 社群版進行使用。
請連接至 NXLog 官方網站的社群版下載頁。
進入後,請在左方的 Version 版本選擇 NXLog Community Edition
(1),在 Platform 平台選擇 Windows
圖示 (2),下方的檔案清單中請勾選 Windows x84-64
(3) 那一筆,如果有多筆請選擇版本最新的即可,最後再按下 Download
(4)。
選擇 NXLog CE 安裝程式
最後一步,NXLog 網站會詢問是否要註冊一組帳號,以利之後可以收到各種 NXLog 相關最新資訊,若有興趣可以點選 Sign Up
註冊,若只想下載 NXlog CE 安裝程式,請點選最下方的 No thanks, just start my download
即可開始下載。
下載 NXLog CE 安裝程式
點選下載完成的安裝程式執行,就如同一般 Windows 應用程式安裝的方式一下,逐步 Next
或 Install
直到完成安裝即可。
執行 NXLog CE 安裝程式
當安裝程式執行到最後一步時,出現如下畫面並顯示有 Completed the NXLog-CE Setup Wizard
的字眼,表示安裝順利完成。
執行 NXLog CE 安裝程式完成
安裝完成後先不要啟動 NXLog 服務 (它剛安裝完成也不會立即啟動),需要先調整設定檔案讓 NXLog 正確的取得應有的記錄來源。
請在系統選單中找到 記事本
,按下滑鼠右鍵選擇 以系統管理員身分執行
。
以管理員身分執行記事本
接著請用記事本的開啟檔案功能,選擇資料夾位置到 C:\Program Files\nxlog\conf
之下,接著將副檔名類型選為 所有檔案
(1),在上方出現一個 nxlog
的 CONF 類型檔案 (2),將它選取後按下開啟。
開啟 NXLog CE 設定檔
將 SpoolDir %ROOT%\data
這一行之後的範例設定全部刪除,下圖中紅框是需要保留的部份,稍候下方會使用我所提供的內容進行設定。
調整 NXLog CE 設定檔
接著請在設定檔的後方貼入以下設定:
<Extension _gelf>
Module xm_gelf
</Extension>
<Input in>
# 2003 (含)以前用 im_mseventlog
# Module im_mseventlog
# Vista (含)以後用 im_msvistalog
Module im_msvistalog
</Input>
<Output out>
Module om_udp
Host 192.168.1.51
Port 32201
OutputType GELF
</Output>
<Route 1>
Path in => out
</Route>
這是一個相當標準的 NXLog 設定檔,NXLog 跟 Graylog 一樣有輸入 (Input) 與輸出 (Output) 的設計,各個區塊說明如下:
<Extension _gelf>
宣告要使用的模組並取名為 _gelf
,本設定檔宣告 xm_gelf,表示稍候會用來處理 GELF 格式的記錄。
<Input in>
宣告一個輸入器並取名為 in
,裡面啟用 im_msvistalog
模組,表示要讀取 Eventlog 的記錄資料做為輸入來源,會自動監視新記錄的加入並處理。若安裝的作業系統是 Vista 及其以後的作業系統請採用 im_msvistalog
,若是較舊的作業系統則採用 im_mseventlog
。
<Output out>
宣告一個輸入器並取名為 out
,裡面啟用 om_udp
表示使用 UDP 傳輸協定,Host
及 Port
指向 Graylog 伺服器的 IP 及 Graylog GELF 輸入器的連接埠號,OutputType
表示使用 GELF 格式傳送過去。
<Route 1>
宣告一條路由並取名為 1
,表示要將 in
這個輸入器進來的資料傳送至 out
這個輸出器指向的 Log 伺服器,建立一條完整的路線。
完成 NXLog CE 設定檔
將設定檔儲存後,請進入 Windows 的 服務
管理程式,找到 NXLog
服務並將它重新啟動,即可讓 NXLog CE 開始傳送後面的新記錄至 Graylog。
重新啟動 NXLog 服務
補充:
選擇用 GELF 格式的好處,就是它可以將 Eventlog 原本的各種欄位完整的傳送至 Graylog 存放為同樣的欄位結構,省去拆解欄位的工作。
進入 Graylog 伺服器的輸入器頁面,找到 GELF UDP 區塊,右方的 Network IO
如有數字變化,表示已經有資料進入。
右方的 Show received messages
按鈕,按下後即可撿視相關記錄。
準備檢視 GELF 輸入器的記錄
進入詳細記錄畫面後,可以看到許多來自 Windows 作業系統以 NXLog 傳送進來的記錄。
檢視 GELF 輸入器收到的記錄
若有某些情況下 Eventlog 沒有自動產生記錄時,也可以手動產生一筆記錄以進行測試。
在 Windows 作業系統中可以利用命令列指令產生一筆測試記錄以協助測試,請先用系統管理員身份進入命令列,接著用法如下:
eventcreate /T WARNING /ID 100 /L APPLICATION /SO mytest /D "This is a test message"
執行完成後,先確認本機的事件檢視器是否有出現:
檢視測試記錄
接著到 Graylog 上搜尋,如果在 Graylog 中有出現,表示事件檢視器有正確收到,且 NXLog CE 正常收到記錄也成功傳送至 Graylog 存放。
搜尋測試記錄
如果要排除 Eventlog 以及 NXLog 套件直接對 Graylog 的 GELF UDP 輸入器進行測試,可以採用以下指令進行驗證,請先開啟 PowerShell 後執行:
[void]([System.Net.Sockets.UdpClient]::new().Send([System.Text.Encoding]::UTF8.GetBytes('{"version":"1.1","host":"myserver","short_message":"Test message","level":5}'), [System.Text.Encoding]::UTF8.GetByteCount('{"version":"1.1","host":"myserver","short_message":"Test message","level":5}'), "192.168.1.51", 32201))
回到 Graylog 伺服器 GELF UDP 輸入器的 Show received message
檢視,即可找到經由剛剛的指令送出的測試記錄。
搜尋測試記錄
經由這些測試技巧,可以協助我們快速判斷問題是出在網路、Eventlog 還是 NXLog CE 套件的相關問題。